<?php
/**
 * Created by PhpStorm.
 * User: s.utkin
 * Date: 17.04.2015
 * Time: 22:00
 */

namespace LogCollector\Handlers;


use LogCollector\LogActionStatistics;
use LogCollector\LogItem;

/**
 * Class LogStatsHandler
 * @package LogCollector\Handlers
 */
class LogStatsHandler implements LogHandlerInterface {

	protected $actionRegexp;
	protected $titleRegexp;
	protected $typeRegexp;
	protected $dataRegexp;

	/**
	 * Модель статистики по экшену
	 *
	 * @var LogActionStatistics
	 */
	protected $statisticModel = null;

	/**
	 * @inheritdoc
	 */
	public function __construct($params)
	{
		$this->actionRegexp = isset($params['actionRegexp']) ? $params['actionRegexp'] : null;
		$this->titleRegexp = isset($params['titleRegexp']) ? $params['titleRegexp'] : null;
		$this->typeRegexp = isset($params['typeRegexp']) ? $params['typeRegexp'] : null;
		$this->dataRegexp = isset($params['dataRegexp']) ? $params['dataRegexp'] : null;
	}

	/**
	 * @inheritdoc
	 */
	public function onBeforeParse($params)
	{
		return;
	}

	/**
	 * @inheritdoc
	 */
	public function process($logItem)
	{
		# фильтры по атрибутам лог-записи
		if (
			(($this->actionRegexp !== null) && !preg_match($this->actionRegexp, $logItem['action'])) ||
			(($this->typeRegexp !== null) && !preg_match($this->typeRegexp, $logItem['type'])) ||
			(($this->titleRegexp !== null) && !preg_match($this->titleRegexp, $logItem['title'])) ||
			(($this->dataRegexp !== null) && !preg_match($this->dataRegexp, $logItem['data']))
		) {
			return;
		}

		$logType = $logItem['type'];

		# сохранение деталей лог-записи
//		$logItemModel = new LogItem();
//		$logItemModel->action = $logItem['action'];
//		$logItemModel->type = $logType;
//		$logItemModel->time = strtotime($logItem['time']);
//		$logItemModel->title = $logItem['title'];
//		$logItemModel->data = $logItem['data'];
//		$logItemModel->save();

		# накопление статистики по экшену
		/** @var LogActionStatistics $statisticsModel */
		$statisticsModel = $this->getActionStatisticsModel($logItem['action'], $logItem['time']);
		# считаем количество штатных стартов и завершений экшена
		if ($logType == 'info') {
			if ($logItem['title'] == 'BEGIN') {
				$statisticsModel->startCount++;
			}

			if ($logItem['title'] == 'END') {
				$statisticsModel->endCount++;
			}
		}

		# считаем количество сообщений по каждому из типов (например: log, info, warn, error)
		$countProperty = "{$logType}Count";
		if (property_exists($statisticsModel, $countProperty)) {
			$statisticsModel->$countProperty = $statisticsModel->$countProperty + 1;
		}
	}

	/**
	 * @inheritdoc
	 */
	public function onAfterParse($params)
	{
		# сохранение статистики по экшену
		if ($this->statisticModel !== null) {
			$this->statisticModel->save();
			$this->statisticModel = null;
		}
	}

	/**
	 * Возвращаем модель статистики по экшену. Если модели нет - создается. Работает по принципу сингтона.
	 *
	 * @param $action - имя экшена
	 * @param $time - время создвания лог-записи
	 * @return LogActionStatistics
	 */
	protected function getActionStatisticsModel($action, $time)
	{
		if ($this->statisticModel == null) {
			$this->statisticModel = new LogActionStatistics();
			$this->statisticModel->action = $action;
			$this->statisticModel->time = strtotime($time);
			$this->statisticModel->startCount = 0;
			$this->statisticModel->endCount = 0;
			$this->statisticModel->logCount = 0;
			$this->statisticModel->infoCount = 0;
			$this->statisticModel->warnCount = 0;
			$this->statisticModel->errorCount = 0;
		}

		return $this->statisticModel;
	}
}